李姜帆 自64 2016011819
选择了星露谷物语的钓鱼游戏作为题目。写了一个环境fish.py模拟该游戏,因为源码也不知道是怎么样的,所以就是架构和一些游玩的经验推测的。
使用play.py即可体验该游戏。蓝色的条为水深,红色的小鱼会在其中随机移动,可以移动的绿色条由玩家控制,按空格键使其上升,松开则会下降。玩家需要使鱼保持在捕捉条中一定时间来获取胜利,鱼离开捕捉条会使捕捉进度下降,右侧的浮标表示捕捉进度。捕捉进度耗光则游戏失败,捕捉进度满则游戏成功。
捕捉条大致按照物理模型设置,另外设有速度上限。
在上下终止处模拟实际物理世界,即高速落下时会反弹,上浮到水面时速度降为零。
鱼的加速度随机生成,另有速度上限控制。
原游戏wiki中给出了五种鱼的运动方式1
可以用不同的加速度分布来模拟。
reward就以是否在捕鱼条内进行奖惩。
class Table
作为离散的算法,针对本游戏连续的环境,可以离散化状态值。Table.ob2state(ob)实现将状态离散化,并存储到状态表中。
Q-learning和SARSA的算法区别主要在学习更新一步,故以两个class Table的子类来实现。
状态空间过大所以训练的效果并不好,2000ep也没有成功过一次,所以还是看下一节吧。


将状态作为神经网络的输入,输出此状态下各个动作的Q值,就可以利用神经网络来存储Q表格,避免了大量的空间去存储Q表。

使用了一层8个单元的隐藏层。主要是考虑以人类来操作的话,大致就是根据位置差和速度差进行判断,不会是很复杂的手段。
100ep训练loss变化:

ep1表现:(GIF在html或Markdown/Typora版本报告中查看)

ep100表现:

可以看到它不仅学习到了紧跟鱼移动,保持钓鱼条的位置,而且在下落时有一定的速度控制,减少触底反弹。
加大鱼随机运动的最大加速度,使鱼更难被捕捉。使用原先训练的模型,效果如下(鱼最大加速度*2):

主要是在测试小车爬山的时候,小车自己很难爬上去,就没有成功的经验。虽说改reward可以让效果比较好,但是有一点人为地降低了难度——“小车学会爬上山顶”变成了“小车学会加速”。所以可以提供一些人类操作的记录,避免很难达到终点而无法学习到知识。
不过对于本游戏来说,并不是很需要,由于成功的reward很容易获得。
通过本次大作业,对强化学习有了更深刻的了解,同时在作业的驱使下了解了一些当前强化学习各种类型手段。通过神经网路来存储Q表真是精湛的想法。
之后可以考虑加一些图像处理,就能在星露谷钓鱼装外挂啦!(妈妈再也不用担心我钓不到鱼啦
强化学习 Reinforcement Learning 教程系列 | 莫烦Python
rl.py 强化学习主程序fish.py钓鱼游戏环境(基于gym)play.py ❤点击❤就玩🎣钓鱼🎣小游戏
memo.npy 8000次人类经验
[s, [action, reward], s'],与网络定义一致play.py中最后一行将save设为True即可进入保存操作模式eval.pt, tar.pt 500ep训练之后的参数